package com.star.core.valid;

import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.star.common.enums.BizStatus;
import com.star.common.exception.BizException;
import lombok.extern.slf4j.Slf4j;

import java.util.Optional;
import java.util.function.Consumer;

/**
 * 是否越权操作
 *
 * @author yangzj
 */
@Slf4j
public class Over {

    /**
     * 是否存在
     *
     * @param wrapper 包装器
     */
    public static <T> void is(LambdaQueryChainWrapper<T> wrapper) {
        if (!wrapper.exists()) {
            log.error("[越权操作] " + wrapper.getSqlSegment());
            throw new BizException(BizStatus.OVER_STEP);
        }
    }

    /**
     * 非管理员 删除的多条是否都是自己的
     *
     * @param wrapper 包装器
     * @param admin   管理员
     */
    public static <T> void iss(LambdaQueryChainWrapper<T> wrapper, Consumer<LambdaQueryChainWrapper<T>> owner, int size, boolean admin) {
        if (admin) {
            return;
        } else {
            owner.accept(wrapper);
        }
        boolean eq = wrapper.count() == size;
        if (eq) {
            return;
        }
        log.error("[越权操作] " + wrapper.getSqlSegment());
        throw new BizException(BizStatus.OVER_STEP);
    }

    /**
     * 是否存在 管理员和非管理都查库
     *
     * @param wrapper 包装器
     * @param admin   管理员
     */
    public static <T> void is(LambdaQueryChainWrapper<T> wrapper, Consumer<LambdaQueryChainWrapper<T>> owner, boolean admin) {
        if (!admin) {
            owner.accept(wrapper);
        }
        boolean exists = wrapper.exists();
        if (exists) {
            return;
        }
        if (admin) {
            throw new BizException("数据不存在");
        } else {
            log.error("[越权操作] " + wrapper.getSqlSegment());
            throw new BizException(BizStatus.OVER_STEP);
        }
    }
    /**
     * 是否存在 并返回对象
     *
     * @param wrapper 包装器
     * @param admin   管理员
     */
    public static <T> T has(LambdaQueryChainWrapper<T> wrapper, Consumer<LambdaQueryChainWrapper<T>> owner, boolean admin) {
        if (!admin) {
            owner.accept(wrapper);
        }
        Optional<T> t = wrapper.oneOpt();
        if (t.isPresent()) {
            return t.get();
        }
        if (admin) {
            throw new BizException("数据不存在");
        } else {
            log.error("[越权操作] " + wrapper.getSqlSegment());
            throw new BizException(BizStatus.OVER_STEP);
        }
    }
}
